/**
 * Servlet GestionMedicamentos: destinado a la gestion de todas las acciones que tendran
 * una vinculacion directa con los medicamentos
 */

package infb.servlet.movil;

// Importaciones externas
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;
import java.util.*;

// Importaciones internas
import infb.modelo.*;
import infb.dao.*;


public class GestionMedicamentos extends HttpServlet {

    MedicamentosInterfaz medicamentoDAO=null;
    boolean isSesionOk;

    /**
     * Metodo para inicializar la capa DAO utilizada en el servlet: muy importante a la hora
     * de optimizar los recursos de nuestra aplicacion
     * @param config
     * @throws javax.servlet.ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // Inicializacion de objetos de la capa DAO
        try{
            isSesionOk=true;
            Context contexto=new InitialContext();
            medicamentoDAO=(MedicamentosInterfaz)contexto.lookup("MedicamentosEJB");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * Metodo auxiliar para la gestion de la solicitud de citas del paciente
     * @param entradaDesdeCliente El flujo de informacion entrante desde el cliente
     *        utilizado para recibir los parametros oportunos que necesitara el metodo
     * @param salidaHaciaCliente El flujo de informacion saliente hacia el cliente
     *        enviado desde el servidor para retransmitir los resultados de las operaciones
     *        realizadas
     * @throws java.io.IOException
     */
    private void buscarMedicamentos(DataInputStream entradaDesdeCliente,DataOutputStream salidaHaciaCliente)
    throws IOException {
        // Leemos los parametros enviados por el cliente: concretamente y para este metodo
        // el nombre del medicamento y su categoria
        String nombre=entradaDesdeCliente.readUTF();
        String categoria=entradaDesdeCliente.readUTF();
        // Mantenimiento de sesion (una vez terminada la lectura)
        salidaHaciaCliente.writeBoolean(isSesionOk);
        // Reutilizamos el metodo de la capa DAO anteriormente implementado
        List listaMedicamentos=medicamentoDAO.busquedaAvanzada(nombre,categoria);
        // Primeramente enviamos al dispositivo movil cliente el numero de medicamentos recuperado
        if(listaMedicamentos==null){
            salidaHaciaCliente.writeInt(0);
        }else{
            salidaHaciaCliente.writeInt(listaMedicamentos.size());
            // Aqui empieza el trabajo duro: recorrer todos los objetos del array y enviar
            // sus atributos al flujo de salida. Esto es realmente definir un protocolo,
            // puesto que en el lado del cliente, deberemos ser consecuentes con esta forma
            // de enviar (en resumen, recibir los mismos parametros en el mismo orden)
            for(int i=0;i<listaMedicamentos.size();i++){
                Medicamentos medicamento=(Medicamentos)listaMedicamentos.get(i);
                salidaHaciaCliente.writeUTF(medicamento.getId().toString());
                salidaHaciaCliente.writeUTF(medicamento.getNombre());
                salidaHaciaCliente.writeUTF(medicamento.getCategoria().getCategoria());
                salidaHaciaCliente.writeUTF(medicamento.getDefinicion());
                salidaHaciaCliente.writeUTF(medicamento.getComposicion());
                salidaHaciaCliente.writeUTF(medicamento.getPosologia());
                salidaHaciaCliente.writeUTF(medicamento.getInteracciones());
                salidaHaciaCliente.writeUTF(medicamento.getEfectosSecundarios());
                salidaHaciaCliente.writeUTF(medicamento.getObservaciones());
            }
        }
        salidaHaciaCliente.flush();
    }

    /**
     * Procesa la peticion del cliente (dispositivo movil) para atender peticiones de login/logout
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    protected void procesarPeticion(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        // Inicializacion de los flujos
        DataInputStream entradaDesdeCliente=new DataInputStream(peticion.getInputStream());
        DataOutputStream salidaHaciaCliente=new DataOutputStream(respuesta.getOutputStream());
         // Realizamos el mantenimiento de sesion
       /* HttpSession sesion=peticion.getSession();
        String perfil=(String)sesion.getAttribute("perfil");
        if(perfil==null){
            isSesionOk=false;
        }*/
        // Procesamos la accion
        String accion=entradaDesdeCliente.readUTF();
        if(accion.equalsIgnoreCase("buscar_medicamentos")){
            buscarMedicamentos(entradaDesdeCliente,salidaHaciaCliente);
        }
        // Cerramos los flujos
        entradaDesdeCliente.close();
        salidaHaciaCliente.close();
    }

    /**
     * Procesamiento de peticiones cliente GET
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doGet(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Procesamiento de peticiones cliente POST
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doPost(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Devuelve una descripcion de la funcionalidad del servlet
     * @return un String con la descripcion del servlet
     */
    @Override
    public String getServletInfo() {
        return "Servlet destinado al procesamiento de acciones relacionadas con los medicamentos dentro de la aplicacion movil";
    }

}
